package A2019;
/*
 * 饱了么”外卖系统中维护着 N 家外卖店，编号 1 ∼ N。每家外卖店都有一个优先级，初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位，如果外卖店没有订单，则优先级会减少 1，最低减到 0；而如果外卖店有订单，则优先级不减反加，每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5，则会被系统加入优先缓存中；如果优先级小于等于 3，则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息，请你计算 T 时刻时有多少外卖店在优先缓存中。
【输入格式】
第一行包含 3 个整数 N、M 和 T 。
以下 M 行每行包含两个整数 ts 和 id，表示 ts 时刻编号 id 的外卖店收到一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时，1 号店优先级降到 3，被移除出优先缓存；2 号店优先级升到 6， 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例，1 ≤ N, M, T ≤ 10000。
对于所有评测用例，1 ≤ N, M, T ≤ 100000，1 ≤ ts ≤ T ，1 ≤ id ≤ N。
 */
import java.util.Scanner;
public class _7_外卖店优先级 {//该解法只能获得一部分分数

	private static int N;
	private static int T;
	private static int M;
	private static int terminal;
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		N=sc.nextInt();
		M=sc.nextInt();
		T=sc.nextInt();
		int[] ans=new int[N+1];
		int[][] sum=new int[N+1][T+1];
		int[] storeNum=new int[N+1];
		boolean[] storeState=new boolean[N+1];
		int[] storeBegin=new int[N+1];//记录店是从哪个时刻开始的,即最小值
		for (int i = 1; i <=M; i++) {
			int a=0,b=0;
			a=sc.nextInt();//哪个时刻
			b=sc.nextInt();//哪家店
			sum[b][a]+=1;
			if(storeBegin[b]!=0)
			storeBegin[b]=Math.min(a,storeBegin[b]);
			else {
				storeBegin[b]=a;
			}
			storeNum[b]++;//记录哪些店有订单
		}
		for (int i = 1; i < sum.length; i++) {
			if(storeNum[i]<=2) continue;//进行剪枝
			for (int j = storeBegin[i]; j < sum[1].length; j++) {
					if(sum[i][j]!=0) {
						ans[i]=ans[i]+2*sum[i][j];
					}else {
						if(ans[i]>0)
						ans[i]--;
					}
					if(ans[i]>5) {
						storeState[i]=true;
					}
					if(ans[i]<=3) {
						storeState[i]=false;
					}
			}
			if(storeState[i]) {
				terminal++;
			}
		}
		System.out.println(terminal);
	}

}
